package sistema;

import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;


import sistema.contexto.avaliacao.AvaliacaoManager;
import sistema.usuario.UsuarioBL;
import sistema.usuario.Turma;
import sistema.usuario.UsuarioIF;
import sistema.usuario.dao.UsuarioXMLDAO;
import sistema.usuario.excecoes.ArquivoInvalido;
import sistema.usuario.excecoes.UsuarioInvalido;
import util.IOUtil;
import util.ResultadoLeitura;
import facade.excecoes.ValidacaoException;

/**
 * Classe principal do sistema.
 * @author Vinicius Ferraz Campos, vinicius.ferraz_at_gmail.com
 * @author Thiago Emmanuel Pereira da Cunha Silva, thiago.manel@gmail.com
 * @author Joao Arthur Brunet Monteiro, joaoarthurbm@gmail.com
 *
 */
public class Sistema {

	private AvaliacaoManager avaliacaoManager;
	private Map<String, Turma> turmas;
	private UsuarioBL baseUsuarios;
	
	/**
	 * Construtor
	 *
	 */
	public Sistema() {
		turmas = new HashMap<String, Turma>();
		this.avaliacaoManager = new AvaliacaoManager();
		this.baseUsuarios = new UsuarioBL(new UsuarioXMLDAO());
//		this.baseUsuarios.adicione("manel", "manel@gmail.com", "manel", "administrador", "");
	}
	
	/**
	 * Cadastra uma nova turma
	 * @param idTurma Identificador da turma
	 * @param descricao a descricao da turma
	 * @param filePath o path do arquivo
	 * @throws IOException
	 * @throws UsuarioInvalido 
	 * @throws ArquivoInvalido 
	 */
	public void cadastraTurma(String idTurma, String descricao, String filePath) throws IOException, ArquivoInvalido {
		if(containsTurma(idTurma)){
			throw new IllegalArgumentException(ValidacaoException.JAH_EXISTE_TURMA);
		}
		Turma turma = new Turma(idTurma,descricao);
		ResultadoLeitura resultado = IOUtil.leUsuariosParaTurma(filePath);
		List<String> alunosOK = resultado.getUsuariosOK();
		Iterator<String> it = alunosOK.iterator();
		while (it.hasNext()) {
			UsuarioIF usuario = baseUsuarios.getUsuario(it.next());
			if (usuario != null) {
				turma.adicioneUsuario(usuario.getLogin());
			}
		}
		turmas.put(idTurma, turma);
	}
	
	/**
	 * Verifica se a turma ja existe
	 * @param idTurma o id da turma
	 * @return true se a turma ja existe ou false se não.
	 */
	private boolean containsTurma(String idTurma) {
		return this.turmas.containsKey(idTurma);
	}

	/**
	 * verifica se a senha � v�lida para o usu�rio
	 * @param login o llogin do usu�rio
	 * @param senha a senha do usu�rio
	 * @return true se a senha for v�lida para o usu�rio, false se n�o.
	 */
	public boolean autentica(String login, String senha) {
//		UsuarioIF usuario = this.baseUsuarios.getUsuario(login);
//		if (usuario == null) {
//			return false;
//		}
//		return usuario.ehSuaSenha(senha);
		return false;
	}

	/**
	 * Cadastra usuarios de um arquivo.
	 * @param fileUsersName o path do arquivo
	 * @throws IOException 
	 * @throws ArquivoInvalido
	 * @throws UsuarioInvalido
	 */
	public void cadastraUsuarios(String fileUsersName) throws IOException, ArquivoInvalido, UsuarioInvalido {
		//FIXME o que fazer com os usuarios que não foram adicionados??!
//		ResultadoLeitura resultado = IOUtil.leiaUsuarios(fileUsersName);
//		java.util.List<String> lista = resultado.getUsuariosOK();
//		Iterator<String> it = lista.iterator();
//		while (it.hasNext()) {
//			UsuarioIF u = this.baseUsuarios.getUsuario(it.next());
//			if (u != null) {
//				baseUsuarios.adicione(u);
//			}
//		}
	}

	/**
	 * Adiciona uma nova turma vazia ao sistema
	 * @param id Identificador da turma
	 * @param descricao
	 */
	public void cadastraTurma(String idTurma, String descricao) {
		if(containsTurma(idTurma)){
			throw new IllegalArgumentException(ValidacaoException.JAH_EXISTE_TURMA);
		}
		Turma turma = new Turma(idTurma,descricao);
		turmas.put(idTurma, turma);
	}

	public Collection<Turma> getTurmas() {
		return Collections.unmodifiableCollection(turmas.values());
	}

	/**
	 * Adiciona alunos em uma turma já existente.
	 * @param idTurma o id da turma
	 * @param filePath o path do arquivo que contém os alunos a serem adicionados.
	 * @throws ArquivoInvalido 
	 * @throws IOException 
	 */
	public void adicionaAlunosNaTurma(String idTurma, String filePath) throws IOException, ArquivoInvalido {
//		Turma turma = this.turmas.get(idTurma);
//		Validate.notNull(turma, ValidacaoException.ID_TURMA_INVALIDO);
//		ResultadoLeitura result = IOUtil.leUsuariosParaTurma(filePath);
//		
//		List<String> usuariosOK = result.getUsuariosOK();
//		Iterator<String> it = usuariosOK.iterator();
//		while (it.hasNext()) {
//			UsuarioIF u = this.baseUsuarios.getUsuario(it.next());
//			if (u != null) {
//				turma.adicioneUsuario(u.getLogin());
//			}
//		}
	}


}
